#!/bin/bash
# 该脚本用于实现 root 用户在 CentOS 中安装社区版的 Docker

# 临时保存并修改语言环境
LANG_temp=$LANG
LANG=zh_CN.UTF-8

# 还原语言环境
function re_lang () {
    # 将语言环境修改回原来的值
    LANG=$LANG_temp
}

# 还原语言环境，并无异常退出
function re_lang_exit () {
    re_lang
    exit 0
}

function success_text () {
    echo -e -n "\033[32m【SUCCESS】\033[0m"
}

function warn_text () {
    echo -e -n "\033[33m【WARN】\033[0m"
}

function error_text () {
    echo -e -n "\033[31m【ERROR】\033[0m"
}

# 检查社区版 Docker 是否已经安装
is_docker_ce_install=`rpm -q docker-ce | grep '未安装软件包.*'`
is_remove_install="n"
if [ -z "$is_docker_ce_install" ]; then
    warn_text
    read -p "Docker 社区版已经安装，是否卸载旧版本重新安装新版本(y/n)[默认 n]：" -n 1 is_remove_install
    echo
fi

if [ "$is_remove_install" = "y" ]; then
    echo "开始检查 CentOS 的版本是否满足安装社区版 Docker 的要求..."

    # 可以安装社区版 Docker 的 CentOS 版本
    centos_release_required=("CentOS Stream 9" "CentOS Stream 8" "CentOS 7")

    # 判断 CentOS 的版本是否满足安装社区版 Docker 的要求
    centos_release=`hostnamectl | grep 'Operating System: \(.*\)'`
    centos_release=${centos_release:18} 
    idx=-1
    for((i=0; i<${#centos_release_required[*]}; i++)); do
        if [[ $centos_release == ${centos_release_required[i]} ]]; then
            idx=$i
            break
        fi
    done
    if [ $idx -lt 0 ] || [ $idx -ge ${#centos_release_required[*]} ]; then
        error_text
        echo "当前 CentOS 的版本是：$centos_release，不是满足安装社区版 Docker 所需的版本"
        re_lang_exit
    fi
    success_text
    echo "当前 CentOS 的版本是：$centos_release，满足安装社区版 Docker 所需"

    # 检查是否具有 yum 工具
    is_yum_install=`rpm -q yum | grep '未安装软件包.*'`
    if [ ${#is_yum_install} -gt 0 ]; then
        error_text
        echo '当前操作系统中不存在 yum 工具，请先进行 yum 工具的安装，或者使用其他方式进行社区版 Docker 的安装'
        re_lang_exit
    fi

    # 使用 yum 卸载旧版本 Docker
    # 会一同将 Docker 所依赖的而又不被其他软件包依赖的软件包卸载删除
    echo "开始卸载旧版本 Docker..."
    yum remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine || re_lang_exit
    success_text
    echo "卸载旧版本 Docker 完成"

    echo "开始进行社区版 Docker 的安装..."

    # 安装 yum-utils，yum-utils 是 yum 的工具包集合，由不同的作者开发，其使 yum 使用起来更加方便和强大。
    yum install -y yum-utils || re_lang_exit
    # 拉取配置阿里云提供的 Docker 下载安装的 yum 软件包仓库
    # 在我们的操作系统本地中添加阿里云提供的 Docker 下载安装的 yum 软件包仓库
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo || re_lang_exit
    # 安装社区版 Docker
    yum -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin || re_lang_exit

    # 检查社区版 Docker 是否安装成功
    is_docker_ce_install=`rpm -q docker-ce | grep '未安装软件包.*'`
    if [ ${#is_yum_install} -gt 0 ]; then
        error_text
        echo '社区版 Docker 安装失败，请重新尝试.'
        re_lang_exit
    fi
fi

success_text
echo "社区版 Docker 安装完成"

# 查看展示 Docker 的版本信息
echo "安装的 Docker 版本为："
docker version || re_lang_exit

# 启动运行 Docker
echo "Docker 启动中..."
systemctl start docker || re_lang_exit

# 配置网易云 Docker 镜像下载中心
echo "配置网易云 Docker 镜像下载中心..."
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://hub-mirror.c.163.com"]
}
EOF
# 让 Docker 重新加载服务配置文件
echo "配置网易云 Docker 镜像下载中心成功，Docker 重新加载服务配置文件中..."
systemctl daemon-reload || re_lang_exit

# 重启运行 Docker，并开启 Docker 开机自启
echo "Docker 重启中..."
systemctl restart docker || re_lang_exit
echo "开启 Docker 开机自启中..."
systemctl enable docker || re_lang_exit
echo "当前 Docker 的状态为："
systemctl status docker || re_lang_exit

re_lang
